/*
 * Copyright (c) 2022.版权所有高金磊
 */

package 领扣算法.AA中等题.设计位集;

import java.util.HashMap;

public class Main {
    /**
     * 请你实现 Bitset 类。
     *
     * Bitset(int size) 用 size 个位初始化 Bitset ，所有位都是 0 。
     * void fix(int idx) 将下标为 idx 的位上的值更新为 1 。如果值已经是 1 ，则不会发生任何改变。
     * void unfix(int idx) 将下标为 idx 的位上的值更新为 0 。如果值已经是 0 ，则不会发生任何改变。
     * void flip() 翻转 Bitset 中每一位上的值。换句话说，所有值为 0 的位将会变成 1 ，反之亦然。
     * boolean all() 检查 Bitset 中 每一位 的值是否都是 1 。如果满足此条件，返回 true ；否则，返回 false 。
     * boolean one() 检查 Bitset 中 是否 至少一位 的值是 1 。如果满足此条件，返回 true ；否则，返回 false 。
     * int count() 返回 Bitset 中值为 1 的位的 总数 。
     * String toString() 返回 Bitset 的当前组成情况。注意，在结果字符串中，第 i 个下标处的字符应该与 Bitset 中的第 i 位一致。
     */
    class Bitset {
        HashMap<Integer,Boolean> data=new HashMap<>();
        int size=0;
        boolean flip=false;
        boolean cache=false,cache1=false;//缓存是否可用
        int sum=0;
        StringBuilder stringBuilder=new StringBuilder(),stringBuilder1=new StringBuilder();

        public Bitset(int size) {
            this.size=size;
        }

        public void fix(int idx) {
            cache=false;
            cache1=false;
            data.put(idx, !flip);
        }

        public void unfix(int idx) {
            cache=false;
            cache1=false;
            data.put(idx, flip);
        }

        public void flip() {
           flip=!flip;
//           cache1=false;
        }

        public boolean all() {
//            if (flip){
//                //判断是不是都是0
//                for (Boolean value : data.values()) {
//                    if (value)
//                    {
//                        return false;
//                    }
//                }
//            }
//            else {
//                //判断是不是都是1
//                if (data.keySet().size()!=size){
//                    //位数不足就是有0
//                    return false;
//                }
//                for (Boolean value : data.values()) {
//                    if (!value){
//                        return false;
//                    }
//                }
//
//            }
//            return true;
            return count()==size;
        }

        public boolean one() {
            return count()>0;
        }

        public int count() {
//            if (!cache) {
//                cache=true;
//                sum=0;
//                for (Boolean value : data.values()) {
//                    if (value)
//                        sum++;
//                }
//            }
            if (flip){
                return size-sum;
            }
            else {
              return sum;
            }
        }

        public String toString() {
            if (!cache1) {
                cache1=true;
                stringBuilder=new StringBuilder();
                for (int i = 0; i < size; i++) {
                    if ( data.getOrDefault(i, false)){
                        stringBuilder.append(1);
                        stringBuilder1.append(0);
                    }
                    else {
                        stringBuilder.append(0);
                        stringBuilder1.append(1);
                    }
                }
            }
            if (flip)
                return stringBuilder.toString();
            else
                return stringBuilder1.toString();
            }
    }
}
